package com.rafahead.firstdb.controler;

import java.util.Date;
import java.util.List;

import com.rafahead.firstdb.R;
import com.rafahead.firstdb.persist.DBAdapter;

import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class EmprestaAiActivity extends ListActivity {
	private Spinner sp;
	private Cursor cursorCategoria;
	private Cursor cursorEmprestimos;
	private DBAdapter db;

	private OnItemClickListener lvListener = new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> adapter, View view,
				int position, long idEmprestimo) {

			//Cursor aux = db.consultarEmprestimo(idEmprestimo);
			Cursor aux = (Cursor) adapter.getItemAtPosition(position);

			// Permite que o Android gerencie o Cursor para melhor desempenho.
			//startManagingCursor(aux);

			String text = "";
			String item = aux.getString(aux.getColumnIndex(DBAdapter.COLUNA_ITEM_EMPRESTIMOS));
			String descri = aux.getString(aux.getColumnIndex(DBAdapter.COLUNA_DESCRICAO_EMPRESTIMOS));
			Long milis = aux.getLong(aux.getColumnIndex(DBAdapter.COLUNA_DATA_DEVOLUCAO_EMPRESTIMOS));
			Long idContato = aux.getLong(aux.getColumnIndex(DBAdapter.COLUNA_ID_CONTATO_EMPRESTIMOS));
			Long idCategoria = aux.getLong(aux.getColumnIndex(DBAdapter.COLUNA_ID_CATEGORIA_EMPRESTIMOS));
			int status = aux.getInt(aux.getColumnIndex(DBAdapter.COLUNA_STATUS_EMPRESTIMOS));

			//stopCursor(aux);

			// Busca o nome da categoria no banco.
			aux = db.consultarCategoria(idCategoria);

			startManagingCursor(aux);

			String nomeCategoria = aux.getString(aux
					.getColumnIndex(DBAdapter.COLUNA_DESCRICAO_CATEGORIA));

			text = "O item: " + item + " possui a descrição: " + descri
					+ ".\n Ele foi adicionado na data "
					+ (new Date(milis)).toString()
					+ ", pertence a categoria de id: " + idCategoria + "("
					+ nomeCategoria + ")";

			if (status == DBAdapter.STATUS_EMPRESTAR) {
				text = text + ", \n foi emprestado pelo contato de id: "
						+ idContato + " ";
			} else {
				text = text + ", \n foi emprestado para o contato de id: "
						+ idContato + " ";
			}

			Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG)
			.show();
			Log.w("EmprestaAiActivity", text);

			stopCursor(aux);

		}
	};

	private OnItemSelectedListener spListener = new OnItemSelectedListener() {

		@Override
		public void onItemSelected(AdapterView<?> adapter, View view,
				int position, long idCategoria) {

			String descricao = null;

			// Verifica qual o item selecionado usando baseando-se nas
			// informações do Cursor.
			//Cursor aux = db.consultarCategoria(idCategoria);

			Cursor aux = (Cursor) adapter.getItemAtPosition(position);

			//startManagingCursor(aux);

			if (aux != null) {
				descricao = aux.getString(aux
						.getColumnIndex(DBAdapter.COLUNA_DESCRICAO_CATEGORIA));
			}

			//stopCursor(aux);

			stopCursor(cursorEmprestimos);

			if ((descricao != null) && (descricao.equalsIgnoreCase("Todos"))) {

				// Busca todos!
				cursorEmprestimos = db.consultarTodosEmprestimosV2();

				// Busca todos emprestimos entre Janeiro de 1970 e a data
				// atual!
				// cursorEmprestimos = db.consultarEmprestimosBetween(new
				// Date(0), new Date());

				// Busca somente os emprestimos entre essas datas.
				// cursorEmprestimos = db.consultarEmprestimosBetween(
				// new Date(10000), new Date());

				// Busca todas datas de emprestimos entre Janeiro de 1970 e
				// a data atual!
				List<Date> datas = db.consultarQuantosEmprestimosBetween(
						new Date(0), new Date());

				// Imprime no LogCat todas as datas de emprestimos.
				for (Date d : datas) {
					Log.w("EmprestaAiActivity", d.toString());
				}
			} else {
				cursorEmprestimos = db.consultarEmprestimosPorCategoria(idCategoria);
			}

			startManagingCursor(cursorEmprestimos);

			SimpleCursorAdapter lvAdapter = new SimpleCursorAdapter(
					getApplicationContext(), R.layout.linha, cursorEmprestimos,
					new String[] { DBAdapter.COLUNA_ITEM_EMPRESTIMOS,
						DBAdapter.COLUNA_CONTATO_EMPRESTIMOS }, new int[] {
						R.id.linha1, R.id.linha2 });

			setListAdapter(lvAdapter);

		}

		@Override
		public void onNothingSelected(AdapterView<?> arg0) {
			// TODO Auto-generated method stub

		}

	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.main);

		sp = (Spinner) findViewById(R.id.sp_categorias);
		sp.setOnItemSelectedListener(spListener);

		ListView lv = getListView();
		lv.setOnItemClickListener(lvListener);
	}

	private void fillData() {

		db = new DBAdapter(getApplicationContext());
		db.open();

		stopCursor(cursorCategoria);

		cursorCategoria = db.consultarTodasCategorias();

		startManagingCursor(cursorCategoria);

		SimpleCursorAdapter spAdapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.linha, cursorCategoria,new String[] { DBAdapter.COLUNA_DESCRICAO_CATEGORIA },
				new int[] { R.id.linha1 });

		if (sp != null) {
			sp.setAdapter(spAdapter);
		}

	}

	protected void onResume() {
		super.onResume();
		fillData();

		// Verificação para evitar ficar inserindo as linhas abaixo a cada
		// onCreate
		if (db.getNumeroDeEmprestimos() == 0) {
			db.criarEmprestimo("Guia do Mochileiro das Galaxias", "Livro 1",
					true, new Date(100), true, 3, 0, "Julio");

			db.criarEmprestimo("Guia do Mochileiro das Galaxias", "Livro 2",
					true, new Date(1000), true, 3, 0, "Gu");

			db.criarEmprestimo("Crime e Castigo", "Um livro lá", true,
					new Date(100000), true, 3, 0, "Zê");

			db.criarEmprestimo("Linkin Park", " Album novo", true, new Date(
					1000000), true, 2, 0, "Gilberto");
		}


	}

	@Override
	protected void onPause() {
		super.onPause();

		stopCursor(cursorCategoria);
		stopCursor(cursorEmprestimos);

		db.close();

	}

	private void stopCursor(Cursor c) {
		if (c != null && !c.isClosed()) {
			stopManagingCursor(c);
			c.close();
		}
	}
}

